package cn.tedu._04mvcboot02.controller;

import cn.tedu._04mvcboot02.common.response.JsonResult;
import cn.tedu._04mvcboot02.common.response.StatusCode;
import cn.tedu._04mvcboot02.mapper.UserMapper;
import cn.tedu._04mvcboot02.pojo.dto.AddUserDTO;
import cn.tedu._04mvcboot02.pojo.entity.User;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**
 * RestController:组合注解,等同于 @Controller + @ResponseBody 注解
 *     添加此注解后,无需在每个控制器方法上再添加@ResponseBody注解
 * RequestMapping:可以添加在类上,也可以添加在控制器方法上
 *     会将类中的地址和控制器方法中的地址进行拼接
 */
//@Controller
@Api(tags = "用户模块")
@RestController
@RequestMapping("/v1/users/")
public class UserController {

    //1.自动装配
    // required参数:
    //    true[默认]: 如果装配失败,则会抛出异常
    //    false: 如果装配失败,则不会报错,代码会继续往下走
    @Autowired(required = false)
    private UserMapper userMapper;

    /**
     * 在 user表中插入1条数据
     */
    @ApiOperation(value = "插入数据")
    @PostMapping("insert")
    public JsonResult addUser(AddUserDTO addUserDTO){
        /*
            1.获取客户端传递过来的数据DTO
            2.存入数据表[接口方法-UserMapper]
            3.返回响应
         */
        //数据表存数据永远使用实体类
        User user = new User();
        //1.复制属性:复制addUserDTO中所有属性值到user对象
        BeanUtils.copyProperties(addUserDTO, user);
        //2.在实体类user中设置DTO中没有的属性
        user.setCreated(new Date());
        //3.调用接口方法
        userMapper.insert(user);

        return new JsonResult(StatusCode.INSERT_SUCCESS);
    }

    /**
     * 查询 user表中所有用户信息
     */
    @ApiOperation(value = "用户列表")
    @GetMapping("userList")
    public JsonResult select(){
        /*
            1.查询所有用户信息,并返回响应[确定接口方法]
         */
        List<User> list = userMapper.selectAll();

        return new JsonResult(StatusCode.SELECT_ALL_SUCCESS, list);
    }

    /**
     * 根据ID删除1个用户信息
     */
    @ApiOperation(value = "删除用户")
    @GetMapping("delete")
    public JsonResult delete(int id){
        /*
            1.调用接口方法删除对应数据
         */
        userMapper.deleteUser(id);

        return new JsonResult(StatusCode.DELETE_SUCCESS);
    }

    /**
     * 修改某个用户的信息
     */
    @ApiOperation(value = "更新用户")
    @GetMapping("update")
    public JsonResult update(User user){
        /*
            1.更新数据[动态SQL]
         */
        userMapper.updateUser(user);
        return new JsonResult(StatusCode.UPDATE_SUCCESS);
    }

    /**
     * @PathVariable注解使用: 根据id查询指定用户的信息
     * 1.地址：/v1/users/用户ID
     * 2.请求方法：GET
     * 3.返回响应：具体用户的对象
     */
    /**
     * 根据用户ID查询某个用户的信息
     */
    @ApiOperation(value = "查询单个用户")
    @GetMapping("{id}")
    public JsonResult selectById(@PathVariable int id){
        User user = userMapper.selectById(id);

        return new JsonResult(StatusCode.SELECT_ID_SUCCESS, user);
    }
}








